<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>枚举基础</title>
<link media="all" rel="stylesheet" type="text/css" href="styles/03e73060321a0a848018724a6c83de7f-theme-base.css" />
<link media="all" rel="stylesheet" type="text/css" href="styles/03e73060321a0a848018724a6c83de7f-theme-medium.css" />

 </head>
 <body class="docs"><div class="navbar navbar-fixed-top">
  <div class="navbar-inner clearfix">
    <ul class="nav" style="width: 100%">
      <li style="float: left;"><a href="language.enumerations.overview.html">« 枚举概览</a></li>
      <li style="float: right;"><a href="language.enumerations.backed.html">回退（Backed）枚举 »</a></li>
    </ul>
  </div>
</div>
<div id="breadcrumbs" class="clearfix">
  <ul class="breadcrumbs-container">
    <li><a href="index.html">PHP Manual</a></li>
    <li><a href="language.enumerations.html">枚举</a></li>
    <li>枚举基础</li>
  </ul>
</div>
<div id="layout">
  <div id="layout-content"><div id="language.enumerations.basics" class="sect1">
  <h2 class="title">枚举基础</h2>

  <p class="para">
   Enum 类似 class，它和 class、interface、trait 共享同样的命名空间。
   也能用同样的方式自动加载。
   一个 Enum 定义了一种新的类型，它有固定、数量有限、可能的合法值。
  </p>


  <div class="example-contents">
   <div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />enum&nbsp;Suit<br /></span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;</span><span style="color: #0000BB">Hearts</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;</span><span style="color: #0000BB">Diamonds</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;</span><span style="color: #0000BB">Clubs</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;</span><span style="color: #0000BB">Spades</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
  </div>


  <p class="para">
   以上声明了新的枚举类型 <code class="literal">Suit</code>，仅有四个有效的值：
   <code class="literal">Suit::Hearts</code>、<code class="literal">Suit::Diamonds</code>、
   <code class="literal">Suit::Clubs</code>、<code class="literal">Suit::Spades</code>。
   变量可以赋值为以上有效值里的其中一个。
   函数可以检测枚举类型，这种情况下只能传入类型的值。
  </p>

  <div class="example-contents">
   <div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">pick_a_card</span><span style="color: #007700">(</span><span style="color: #0000BB">Suit&nbsp;$suit</span><span style="color: #007700">)&nbsp;{&nbsp;...&nbsp;}<br /><br /></span><span style="color: #0000BB">$val&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">Suit</span><span style="color: #007700">::</span><span style="color: #0000BB">Diamonds</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">//&nbsp;OK<br /></span><span style="color: #0000BB">pick_a_card</span><span style="color: #007700">(</span><span style="color: #0000BB">$val</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">//&nbsp;OK<br /></span><span style="color: #0000BB">pick_a_card</span><span style="color: #007700">(</span><span style="color: #0000BB">Suit</span><span style="color: #007700">::</span><span style="color: #0000BB">Clubs</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">//&nbsp;TypeError:&nbsp;pick_a_card():&nbsp;Argument&nbsp;#1&nbsp;($suit)&nbsp;must&nbsp;be&nbsp;of&nbsp;type&nbsp;Suit,&nbsp;string&nbsp;given<br /></span><span style="color: #0000BB">pick_a_card</span><span style="color: #007700">(</span><span style="color: #DD0000">'Spades'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
  </div>


  <p class="para">
   一个枚举可以定义零个或多个<code class="literal">case</code>，且没有最大数量限制。
   虽然零个 case 的 enum 没什么用处，但在语法上也是有效的。
  </p>

  <p class="para">
    枚举条目的语法规则适用于 PHP 中的任何标签，参见<a href="language.constants.html" class="link">常量</a>。
   </p>

  <p class="para">
   默认情况下，枚举的条目（case）本质上不是标量。
   就是说 <code class="literal">Suit::Hearts</code> 不等同于 <code class="literal">&quot;0&quot;</code>。
   其实，本质上每个条目是该名称对象的单例。具体来说：
  </p>

  <div class="example-contents">
   <div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$a&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">Suit</span><span style="color: #007700">::</span><span style="color: #0000BB">Spades</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$b&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">Suit</span><span style="color: #007700">::</span><span style="color: #0000BB">Spades</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$a&nbsp;</span><span style="color: #007700">===&nbsp;</span><span style="color: #0000BB">$b</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//&nbsp;true<br /><br /></span><span style="color: #0000BB">$a&nbsp;</span><span style="color: #007700">instanceof&nbsp;</span><span style="color: #0000BB">Suit</span><span style="color: #007700">;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;true<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
  </div>


  <p class="para">
   由于对象间的大小比较毫无意义，这也意味着 enum 值从来不会 <code class="literal">&lt;</code> 或 <code class="literal">&gt;</code> 其他值。
   当 enum 的值用于比较时，总是返回 <strong><code>false</code></strong>。
  </p>

  <p class="para">
   这类没有关联数据的条目（case），被称为“纯粹条目”（Pure Case）。
   仅包含纯粹 Case 的 Enum 被称为纯粹枚举（Pure Enum）。
  </p>

  <p class="para">
   枚举类型里所有的纯粹条目都是自身的实例。
   枚举类型在内部的实现形式是一个 class。
  </p>

  <p class="para">
   所有的 case 有个只读的属性 <code class="literal">name</code>。
   它大小写敏感，是 case 自身的名称。
  </p>

  <div class="example-contents">
   <div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">print&nbsp;</span><span style="color: #0000BB">Suit</span><span style="color: #007700">::</span><span style="color: #0000BB">Spades</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">//&nbsp;输出&nbsp;"Spades"<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
  </div>


 </div></div></div></body></html>